//
// Created by 24319 on 2025/5/25.
//

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "LED_Control.h"
#include "stm32f1xx_hal.h"
#include "../Hardware/OLED.h"

#define DEBOUNCE_TIME 50// 定义消抖时间（毫秒）
static uint8_t buttonState = GPIO_PIN_SET;
static uint32_t lastDebounceTime = 0;
static uint8_t ledStatus = 0;  // 新增：LED状态变量(0=灭,1=亮)
extern bool LEDSTATE;
uint8_t GetLEDStatus(void) {
    return ledStatus;
}

/**
 * @brief GPIO外部中断回调函数，处理按键防抖和LED控制
 * @param GPIO_Pin 触发中断的引脚号
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    // 读取当前按键状态
    GPIO_PinState currentState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4);

    // 检测按键状态变化
    if (currentState != buttonState) {
        // 重置消抖计时器
        lastDebounceTime = HAL_GetTick();
    }

    // 保存当前状态
    buttonState = currentState;

    // 当按键稳定为按下状态时执行动作
    if ((HAL_GetTick() - lastDebounceTime) > DEBOUNCE_TIME)
    {
        if (currentState == GPIO_PIN_RESET)
        {
            // 执行LED翻转操作
            HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3);
            // 更新LED状态变量
            ledStatus = !ledStatus;
            // 等待按键释放，避免重复触发
            while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET);
        }
    }
}

/**
 * @brief 读取LED状态并显示在OLED上
 */
void ReadLEDState(void)
{
    if(GetLEDStatus() == 1)
    {
        OLED_ShowString(2, 2, " LED:ON   ");
        LEDSTATE=true;
    }
    else
    {
        OLED_ShowString(2, 2, " LED:OFF   ");
        LEDSTATE=false;
    }
}

/**
 * @brief 检查数据缓冲区中是否包含"RECV"字符串（ONENET数据标识）
 * @param buffer 数据缓冲区指针
 * @param length 缓冲区长度
 * @return 1-找到匹配; 0-未找到
 */
uint8_t CheckForONENETData(uint8_t *buffer, uint16_t length) {
    // 遍历数组，注意防止越界(需要留出一个字符的检查空间)
    for (uint16_t i = 0; i < length - 1; i++)
    {
        if (buffer[i] == 'R')
        {
            if (buffer[i + 1] == 'E')
            {
                if(buffer[i + 2]=='C')
                {
                    if(buffer[i + 3]=='V')
                    {
                        return 1;
                    }
                }
            }
        }
    }
    return 0;  // 遍历结束未找到，返回失败
}
/**
 * @brief 检查ONENET数据中的LED控制命令（"fal"=关，"tru"=开）
 * @param buffer 数据缓冲区指针
 * @param length 缓冲区长度
 * @return 0-无命令; 1-关LED; 2-开LED
 */
uint8_t CheckForONENETData_LED(uint8_t *buffer, uint16_t length) {
    // 遍历数组，注意防止越界(需要留出一个字符的检查空间)
    for (uint16_t i = 0; i < length - 1; i++)
    {
        if (buffer[i] == '\r')
        {
            if (buffer[i + 1] == '\n')
            {
                 break;
            }
        }
        if (buffer[i] == 'f')
        {
            if (buffer[i + 1] == 'a')
            {
                if(buffer[i + 2]=='l')
                {
                    return 1;
                }

            }
        }
    }

    for (uint16_t i = 0; i < length - 1; i++)
    {
        // 检查当前字符是否为'O'
        if (buffer[i] == '\r')
        {
            if (buffer[i + 1] == '\n')
            {
                break;
            }
        }
        if (buffer[i] == 't')
        {
            // 如果是'O'，继续检查下一个字符是否为'K'
            if (buffer[i + 1] == 'r')
            {
                if(buffer[i + 2]=='u')
                {
                    return 2;
                }
            }
        }
    }
    return 0;  // 遍历结束未找到，返回失败
}

/**
 * @brief 解析ONENET数据并控制LED状态
 * @param String 包含ONENET数据的字符串
 */

void GetONENETData(char *String)
{
    uint8_t ONENET_Control_LED = 0;//0初始化  1关  2开
    if(CheckForONENETData(String, 50)==1)
    {
        ONENET_Control_LED = CheckForONENETData_LED(String,200);
        if(ONENET_Control_LED==1)
        {
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
            ledStatus = !ledStatus;
            memset(String, 0, 200);
        }
        else if(ONENET_Control_LED==2)
        {
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
            ledStatus = !ledStatus;
            memset(String, 0, 200);
        }
    }
}